/*******************************************************************************
*	                           bsp.c
*******************************************************************************/
#include "bsp.h"

/*******************************************************************************
*	                           function
*******************************************************************************/
void bsp_gpio_init(void);
void bsp_cpu_option_check(void);
void bsp_pw_delay_for_bug(void);
void bsp_clk_init(void);
void bsp_adc_init(void);
uint32_t bsp_pwm_init(void);
uint32_t bsp_cap_init(void);
void bsp_clk_init(void);
void bsp_qpi_init(void);
void bsp_clk_get(void);

/*******************************************************************************
*	                           var
*******************************************************************************/
bsp_info_type bsp_info;

/*******************************************************************************
* @brief  bsp_Init : first line in first task
* \param[in] none
* \retval: none
*******************************************************************************/
void bsp_Init(void)
{
	bsp_pw_delay_for_bug();

	bsp_cpu_option_check();

	bsp_clk_init();

	bsp_clk_get();
	
	bsp_delay_init();

	bsp_gpio_init();
	
	bsp_sdram_init();	

	app_tick_init(1);

	//bsp_dly_init();
	
	bsp_uart_init();
}

/*******************************************************************************
* @brief  bsp_clk_init
* \param[in] none
* \retval: none
*******************************************************************************/
void bsp_clk_init(void)
{
    /* Set PERCLK_CLK source to AHB_CLK*/
    CLOCK_SetMux(kCLOCK_PerclkMux, 0U);
	
	// SW/6=80
	CLOCK_SetMux(kCLOCK_UartMux, 0U);
	
	
    /* Set PERCLK_CLK divider to 2 */
    CLOCK_SetDiv(kCLOCK_PerclkDiv, 1U);
	

	CLOCK_EnableClock(kCLOCK_Pit);     
	CLOCK_EnableClock(kCLOCK_Lpuart1);  
	CLOCK_EnableClock(kCLOCK_Lpuart2); 
}

/*******************************************************************************
* @brief  bsp_clk_get
* \param[in] none
* \retval: none
*******************************************************************************/
void bsp_clk_get(void)
{
	bsp_info.clk.IPG = CLOCK_GetFreq(kCLOCK_IpgClk);
	bsp_info.clk.CPU = CLOCK_GetFreq(kCLOCK_CpuClk);
	bsp_info.clk.AHB = CLOCK_GetFreq(kCLOCK_AhbClk);
	bsp_info.clk.Semc = CLOCK_GetFreq(kCLOCK_SemcClk);
	bsp_info.clk.PER = CLOCK_GetFreq(kCLOCK_PerClk);
	bsp_info.clk.RTC = CLOCK_GetFreq(kCLOCK_RtcClk);
	bsp_info.clk.OSC = CLOCK_GetFreq(kCLOCK_OscClk);
	
	bsp_info.clk.USB1PLL = CLOCK_GetFreq(kCLOCK_Usb1PllClk);
	bsp_info.clk.USB1PLL_PFD0 = CLOCK_GetFreq(kCLOCK_Usb1PllPfd0Clk);
	bsp_info.clk.USB1PLL_PFD1 = CLOCK_GetFreq(kCLOCK_Usb1PllPfd1Clk);
	bsp_info.clk.USB1PLL_PFD2 = CLOCK_GetFreq(kCLOCK_Usb1PllPfd2Clk);
	bsp_info.clk.USB1PLL_PFD3 = CLOCK_GetFreq(kCLOCK_Usb1PllPfd3Clk);
	bsp_info.clk.USB1_SW = CLOCK_GetFreq(kCLOCK_Usb1SwClk);
	bsp_info.clk.USB1_SW60 = CLOCK_GetFreq(kCLOCK_Usb1Sw60MClk);
	bsp_info.clk.USB1_SW80 = CLOCK_GetFreq(kCLOCK_Usb1Sw80MClk);
	
	bsp_info.clk.SysPLL = CLOCK_GetFreq(kCLOCK_SysPllClk);
	bsp_info.clk.SysPll_PFD0 = CLOCK_GetFreq(kCLOCK_SysPllPfd0Clk);
	bsp_info.clk.SysPll_PFD1 = CLOCK_GetFreq(kCLOCK_SysPllPfd1Clk);
	bsp_info.clk.SysPll_PFD2 = CLOCK_GetFreq(kCLOCK_SysPllPfd2Clk);
	bsp_info.clk.SysPll_PFD3 = CLOCK_GetFreq(kCLOCK_SysPllPfd3Clk);
	
	bsp_info.clk.EnetPLL = CLOCK_GetFreq(kCLOCK_EnetPllClk);
	bsp_info.clk.EnetPLL25 = CLOCK_GetFreq(kCLOCK_EnetPll25MClk);
	bsp_info.clk.EnetPLL500 = CLOCK_GetFreq(kCLOCK_EnetPll500MClk);
	
	bsp_info.clk.AudioPLL = CLOCK_GetFreq(kCLOCK_AudioPllClk);
}

/*******************************************************************************
* @brief  bsp_pw_delay_for_bug
* \param[in] none
* \retval: none
*******************************************************************************/
void bsp_pw_delay_for_bug(void)
{
	volatile uint32_t dly = 120 * 1000 * 1000 / 12;
	while (dly--)
	{
	}
}

/*******************************************************************************
* @brief  bsp_Idle
* \param[in] none
* \retval: none
*******************************************************************************/
void bsp_Idle(void)
{
}
